package cidca.ia.pkg21;

import java.io.*;
import java.net.*;
import java.util.logging.*;


public class ServidorHilo extends Thread {

    private Socket socket;
    private DataOutputStream dos;
    private DataInputStream dis;
    private int idSessio;
    private int[][] cartas;
    private int[][] cartasOcultas;
    private int[] jugadores;
    private int[] Apuestajugadores;
    private int contadorTurnos;
    // Aqui variamos la cantidad de jugadores
    private int cantidadJugadores=1;

    public ServidorHilo(Socket socket, int id, int[][] mazo, int[][] ocultas, int[] jugador, int[] Apuesta, int turno) {
        cartas=mazo;
        cartasOcultas=ocultas;
        this.socket = socket;
        this.idSessio = id;
        jugadores=jugador;
        jugadores[id] = 1; // Estado inicial jugador
        Apuestajugadores = Apuesta;
        Apuestajugadores[id] = 1; // Estado inicial jugador
        contadorTurnos=turno;
        try {
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new DataInputStream(socket.getInputStream());
        } catch (IOException ex) {
            Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void desconnectar() {
        try {
            socket.close();
        } catch (IOException ex) {
            Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        String accion = "";
        try {
            while(true){
                if (jugadores[this.idSessio]==4){
                    // Es el turno del usuario
                    if (contadorTurnos==this.idSessio){
                        // Esperando respuesta del Jugador
                        dos.writeUTF("PIDE?");
                        accion = dis.readUTF();
                        switch (accion) {
                            case "SI":
                                // PIDE CARTA
                                int usuario = this.idSessio+1;
                                int[] valor = sortea(usuario);
                                int pinta=valor[1];
                                int valorDado=valor[0];                    
                                String carta = pinta(pinta);
                                dos.writeUTF("ABIERTA|"+carta+"|"+valorDado);
                                break;
                            case "NO":
                                // Se plantó                                
                                Apuestajugadores[this.idSessio]=7;
                                for (int i=0;i<jugadores.length;i++){
                                    jugadores[i]=6;
                                }
                                break;
                            case "PERDI":
                                Apuestajugadores[this.idSessio]=8;
                                for (int i=0;i<jugadores.length;i++){
                                    jugadores[i]=6;
                                }
                                break;
                        }
                    }
                }
                if (jugadores[this.idSessio]<3){
                    System.out.println("Hola soy el hilo "+this.idSessio+" Estado " + jugadores[this.idSessio]);
                }
                if (jugadores[this.idSessio]==2){
                    //dos.writeUTF("<<NUEVO ESTADO>>");
                    String mesa = mensajeSalida1();
                    dos.writeUTF(mesa);                    
                    jugadores[this.idSessio]=3;
                }
                if (jugadores[this.idSessio]==6){
                    dos.writeUTF("<<NUEVO ESTADO>>");
                    String mesa = mensajeSalida1();
                    dos.writeUTF(mesa);                    
                    jugadores[this.idSessio]=4;
                    contadorTurnos=contadorTurnos+1;
                }
                if (jugadores[this.idSessio]==1){
                    System.out.println("El cliente con idSesion "+this.idSessio+" saluda");
                    int usuario = this.idSessio+1;
                    //usuarios[usuario]=1;
                    int valorDado = 0;
                    int pinta = 0;
                    int OCULTAvalorDado = 0;
                    int OCULTApinta = 0;
                    // Sortea hasta que encuentre una carta libre
                    while (true){
                        OCULTAvalorDado = (int) Math.floor(Math.random()*13+1);
                        OCULTApinta = (int) Math.floor(Math.random()*3);
                        // No está ni en la oculta y en el maso abierto
                        if (cartas[OCULTApinta][OCULTAvalorDado]==0 && cartasOcultas[OCULTApinta][OCULTAvalorDado]==0){
                            break;
                        }                        
                    }
                    cartasOcultas[OCULTApinta][OCULTAvalorDado]=usuario;
                    String carta = pinta(pinta);
                    dos.writeUTF("USTED|"+usuario);
                    dos.writeUTF("OCULTA|"+carta+"|"+OCULTAvalorDado);
                    int[] valor = sortea(usuario);
                    pinta=valor[1];
                    valorDado=valor[0];                    
                    carta = pinta(pinta);
                    dos.writeUTF("ABIERTA|"+carta+"|"+valorDado);
                    String mesa = mensajeSalida1();
                    dos.writeUTF("<<NUEVO ESTADO>>");
                    dos.writeUTF(mesa);
                    // Cambio el estado de todos los jugadores porque entro uno nuevo se
                    // Se repartio carta entonces todos se enteran
                    for (int i=0;i<jugadores.length;i++){
                        jugadores[i]=2;
                    }
                    jugadores[this.idSessio]=3;
                    // Se completó el número de jugadores
                    if (cantidadJugadores==usuario){
                        // Cambio a modo jugadores
                        for (int i=0;i<jugadores.length;i++){
                            jugadores[i]=4;
                        }                        
                    }
                }
            }
            
        } catch (IOException ex) {
            Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
        }
        //desconnectar();
    }
    private String pinta(int pinta){
        String carta = "CORAZONES";
        if (pinta==1){
            carta = "DIAMANTES";                            
        }
        if (pinta==2){
            carta = "TREBOLES";                            
        }
        if (pinta==3){
            carta = "PICAS";                            
        }
        return carta;
    }
    // Función para sortear hasta que encuentra una carta libre
    private int[] sortea(int usuario){
        int[] valor = new int[2];
        int valorDado = 0;
        int pinta = 0;
        while (true){
            valorDado = (int) Math.floor(Math.random()*13+1);
            pinta = (int) Math.floor(Math.random()*3);
            // No está ni en la oculta y en el maso abierto
            if (cartas[pinta][valorDado]==0 && cartasOcultas[pinta][valorDado]==0){
                break;
            }                        
        }
        valor[0]=valorDado;
        valor[1]=pinta;
        cartas[pinta][valorDado]=usuario;
        return valor;
    }
    private String mensajeSalida1(){
        String mesa = "CORAZONES|" + cartas[0][0] + "," + cartas[0][1]+ "," + cartas[0][2]+ "," + cartas[0][3]+ "," + cartas[0][4]+ "," + cartas[0][5]+ "," + cartas[0][6]+ "," + cartas[0][7]+ "," + cartas[0][8]+ "," + cartas[0][9]+ "," + cartas[0][10]+ "," + cartas[0][11]+ "," + cartas[0][12];
        mesa = mesa + "\nDIAMANTES|" +  cartas[1][0] + "," + cartas[1][1]+ "," + cartas[1][2]+ "," + cartas[1][3]+ "," + cartas[1][4]+ "," + cartas[1][5]+ "," + cartas[1][6]+ "," + cartas[1][7]+ "," + cartas[1][8]+ "," + cartas[1][9]+ "," + cartas[1][10]+ "," + cartas[1][11]+ "," + cartas[1][12];
        mesa = mesa + "\nTREBOLES|" + cartas[2][0] + "," + cartas[2][1]+ "," + cartas[2][2]+ "," + cartas[2][3]+ "," + cartas[2][4]+ "," + cartas[2][5]+ "," + cartas[2][6]+ "," + cartas[2][7]+ "," + cartas[2][8]+ "," + cartas[2][9]+ "," + cartas[2][10]+ "," + cartas[2][11]+ "," + cartas[2][12];
        mesa = mesa + "\nPICAS|" + cartas[3][0] + "," + cartas[3][1]+ "," + cartas[3][2]+ "," + cartas[3][3]+ "," + cartas[3][4]+ "," + cartas[3][5]+ "," + cartas[3][6]+ "," + cartas[3][7]+ "," + cartas[3][8]+ "," + cartas[3][9]+ "," + cartas[3][10]+ "," + cartas[3][11]+ "," + cartas[3][12];
        for (int i=0;i<Apuestajugadores.length;i++){            
            if (Apuestajugadores[i]==7){
                mesa = mesa + "\nJUGADOR|"+(i+1)+"|PLANTO";
            }
            if (Apuestajugadores[i]==8){
                mesa = mesa + "\nJUGADOR|"+(i+1)+"|PERDIO";
            }
        }
        //mesa = mesa  + "\n"+contadorTurnos;
        return mesa;
    }
}
